package guiPackage;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;

import klantPackage.Klant;
import parkeerPackage.ParkeerPlaats;
import parkeerPackage.ParkeerReservering;
import viewPackage.AanbodWijzigen;
import viewPackage.AfspraakToevoegen;
import viewPackage.ArtikelBijwerken;
import viewPackage.DienstBijwerken;
import viewPackage.FactuurAanmaken;
import viewPackage.HoofdMenu;
import viewPackage.IetsSelecteren;
import viewPackage.KlantToevoegen;
import viewPackage.KortingGeven;
import viewPackage.ParkeerPlaatsReserveren;
import viewPackage.StandaardFrame;
import aanbodPackage.Artikel;
import controllerPackage.Controller;
import factuurPackage.Factuur;
import factuurPackage.FactuurRegel;

public class ViewController {
	private Controller				controllerGUILink;
	private JFrame					frame;
	private HoofdMenu				hmView;
	private KlantToevoegen			ktView;
	private IetsSelecteren			ksView;
	private ParkeerPlaatsReserveren	prView;
	private AanbodWijzigen			awView;
	private AfspraakToevoegen		atView;
	private FactuurAanmaken			faView;
	private KortingGeven			kgView;
	private StandaardFrame			sdFrame;
	private ArtikelBijwerken		abView;
	private DienstBijwerken			dbView;

	public ViewController() {
		controllerGUILink = new Controller();
		sdFrame = new StandaardFrame(new JPanel());
		frame = sdFrame;
	}

	public void showHoofdMenu() {
		hmView = new HoofdMenu();
		frame.setContentPane(hmView);
		frame.setVisible(true);
		frame.setSize(300, 300);
		hmView.setListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (e.getSource() == hmView.getKlantToevoegenButton()) {
					showKlantToevoegen();
				}
				if (e.getSource() == hmView.getParkeerPlaatsReserverenButton()) {
					showParkeerPlaatsReserveren();
				}
				if (e.getSource() == hmView.getAanbodWijzigenButton()) {
					showAanbodWijzigen();
				}
				if (e.getSource() == hmView.getFactuurAanmaken()) {
					showFactuurMaken();
				}
				if (e.getSource() == hmView.getAfspraakToevoegenButton()) {
					showAfspraakToevoegen();
				}
				if (e.getSource() == hmView.getKortingGevenButton()) {
					showKortingGeven();
				}
			}
		});
	}

	public void showAfspraakToevoegen() {
		atView = new AfspraakToevoegen();
		frame.setContentPane(atView);
		frame.setVisible(true);
		frame.pack();

		final Object[] selectedDienst = { null }, selectedKlant = { null };
		final Integer[] dienstPositie = { null }, klantPositie = { null };

		atView.setListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (e.getSource() == atView.getKlantSelecterenButton()) {
					ArrayList<?> klantenLijst = controllerGUILink.getKentAlleKlanten();
					IetsSelecteren klantenLijstView = showIetsSelecteren("Klant");
					Object selectedObject = klantenLijstView.showDialog(klantenLijst);
					if (selectedObject != null && !(selectedObject instanceof Integer)) {
						selectedKlant[0] = selectedObject;
						klantPositie[0] = matchPlace(klantenLijst, selectedKlant[0]);
						atView.getKlantVak().setText(controllerGUILink.getKentAlleKlanten().get(klantPositie[0]).getNaam());
					}
				}
				if (e.getSource() == atView.getDienstSelecterenButton()) {
					ArrayList<?> dienstenLijst = controllerGUILink.getKentHetAanbod().getKentAlleDiensten();
					IetsSelecteren dienstenLijstView = showIetsSelecteren("Dienst");
					Object selectedObject = dienstenLijstView.showDialog(dienstenLijst);

					if (selectedObject != null && !(selectedObject instanceof Integer)) {
						selectedDienst[0] = selectedObject;
						dienstPositie[0] = matchPlace(dienstenLijst, selectedDienst[0]);
						atView.getDienstVak().setText(controllerGUILink.getKentHetAanbod().getKentAlleDiensten().get(dienstPositie[0]).getDienstOmschrijving());
					}

				}
				if (e.getSource() == atView.getTerugButton()) {
					showHoofdMenu();
				}
				if (e.getSource() == atView.getAfspraakToevoegenButton()) {
					int hoogsteID = 0, tempID = 0, afspraakID;
					for (int i = 0; i < controllerGUILink.getKentAgenda().alleAfspraken().size(); i++) {
						tempID = controllerGUILink.getKentAgenda().alleAfspraken().get(i).getAfspraakID();
						if (tempID > hoogsteID) {
							hoogsteID = tempID;
						}
					}
					afspraakID = hoogsteID + 1;
					Date afspraakDate = null;
					String datumTekst = atView.getDatumVak().getText();
					SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy-hh:mm");
					double tijd = 0;

					if ((selectedDienst[0] != null) && (selectedKlant[0] != null) && (klantPositie[0] != null) && (dienstPositie[0] != null)) {
						try {
							tijd = Double.parseDouble(atView.getTijdVak().getText());
							afspraakDate = dateFormat.parse(datumTekst);
							controllerGUILink.getKentAgenda().nieuweAfspraak(afspraakID, afspraakDate, tijd,
									controllerGUILink.getKentHetAanbod().getKentAlleDiensten().get(dienstPositie[0]), controllerGUILink.getKentAlleKlanten().get(klantPositie[0]));
							showOKMelding("Gelukt!", "Gegevens opgeslagen");
						} catch (NumberFormatException e1) {
							showOKMelding("Invoerfout!", "Onjuiste duur ingevuld.");
						} catch (ParseException e1) {
							showOKMelding("Invoerfout!", "Onjuiste datum ingevuld.");
						}
					} else {
						showOKMelding("Onjuiste invoer!", "Geen klant/dienst geselecteerd.");
					}
				}
			}
		});

	}

	public void showAlleRapporten() {
	}

	public ArtikelBijwerken showArtikelBijwerken(final Object artikelObject) {
		abView = new ArtikelBijwerken();
		abView.setListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Object artikel = artikelObject;
				if (e.getSource() == abView.getTerugButton()) {
					showHoofdMenu();
				}
				if (e.getSource() == abView.getToevoegenButton()) {
					boolean nieuw = false;
					int artikelID = 0;
					ArrayList<?> alleArtikelen = controllerGUILink.getKentHetAanbod().getKentAlleArtikelen();
					if (artikel == null) {
						int hoogsteID = 0, tempID = 0;
						for (int i = 0; i < alleArtikelen.size(); i++) {
							tempID = controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().get(i).getArtikelID();
							if (tempID > hoogsteID) {
								hoogsteID = tempID;
							}
						}
						artikelID = hoogsteID + 1;
						nieuw = true;
						// int positie = matchPlace(alleArtikelen, artikel);
						try {
							if (abView.getNaamVak().getText().trim().length() > 0) {
								int i = controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().size();
								controllerGUILink.getKentHetAanbod().nieuwArtikel(artikelID, abView.getBeschrijvingVak().getText(), abView.getNaamVak().getText(),
										Double.parseDouble(abView.getPrijsVak().getText()));
								if (i < controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().size()) {
									showOKMelding("Gelukt!", "Gegevens opgeslagen");
								} else {
									showOKMelding("FAIL!", "Artikel bestaat al");
								}
							} else {
								showOKMelding("FAIL!", "Naam mag niet leeg zijn");
							}
						} catch (NumberFormatException e1) {
							showOKMelding("Invoerfout!", "Prijs of voorraad onjuist");

						}

					}
					int positie = matchPlace(alleArtikelen, artikel);
					if (!nieuw) {
						try {
							controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().get(positie).setBeschrijving(abView.getBeschrijvingVak().getText());
							controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().get(positie).setNaam(abView.getNaamVak().getText());
							controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().get(positie).setVoorraad(Integer.parseInt(abView.getVoorraadVak().getText()));
							controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().get(positie).setPrijs(Double.parseDouble(abView.getPrijsVak().getText()));
							showOKMelding("Gelukt!", "Gegevens opgeslagen");
						} catch (NumberFormatException e1) {
							showOKMelding("Invoerfout!", "Prijs of voorraad onjuist");
						}
					}
				}
			}
		});
		return abView;
	}

	public void showBetalingen() {
	}

	public void showBevestigFactuur() {
	}

	public DienstBijwerken showDienstBijwerken(final Object dienstObject) {
		dbView = new DienstBijwerken();
		dbView.setListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Object dienst = dienstObject;
				if (e.getSource() == dbView.getTerugButton()) {
					showHoofdMenu();
				}
				if (e.getSource() == dbView.getToevoegenButton()) {
					boolean nieuw = false;
					int dienstID = 0;
					ArrayList<?> alleDiensten = controllerGUILink.getKentHetAanbod().getKentAlleDiensten();
					if (dienst == null) {
						int hoogsteID = 0, tempID = 0;
						for (int i = 0; i < alleDiensten.size(); i++) {
							tempID = controllerGUILink.getKentHetAanbod().getKentAlleDiensten().get(i).getDienstID();
							if (tempID > hoogsteID) {
								hoogsteID = tempID;
							}
						}
						dienstID = hoogsteID + 1;
						nieuw = true;

						try {
							if (dbView.getBeschrijvingVak().getText().trim().length() > 0) {
								int i = controllerGUILink.getKentHetAanbod().getKentAlleDiensten().size();
								controllerGUILink.getKentHetAanbod().nieuwDienst(dienstID, dbView.getBeschrijvingVak().getText(),
										Double.parseDouble(dbView.getPrijsVak().getText()), Double.parseDouble(dbView.getTijdVak().getText()));
								// TODO::melding geven als artikel al bestaat
								if (i < controllerGUILink.getKentHetAanbod().getKentAlleDiensten().size()) {

									showOKMelding("Gelukt!", "Gegevens opgeslagen");
								} else {
									showOKMelding("FAIL!", "Dienst bestaat al");
								}
							} else {
								showOKMelding("FAIL!", "Beschrijving mag niet leeg zijn");
							}
						} catch (NumberFormatException e1) {
							showOKMelding("Invoerfout!", "Prijs of voorraad onjuist");

						}
					}
					int positie = matchPlace(alleDiensten, dienst);
					if (!nieuw) {
						try {
							controllerGUILink.getKentHetAanbod().getKentAlleDiensten().get(positie).setDienstOmschrijving(dbView.getBeschrijvingVak().getText());
							controllerGUILink.getKentHetAanbod().getKentAlleDiensten().get(positie).setDienstTijd(Double.parseDouble(dbView.getTijdVak().getText()));
							controllerGUILink.getKentHetAanbod().getKentAlleDiensten().get(positie).setDienstPrijs(Double.parseDouble(dbView.getPrijsVak().getText()));
							showOKMelding("Gelukt!", "Gegevens opgeslagen");
						} catch (NumberFormatException e1) {
							showOKMelding("Invoerfout!", "Prijs of tijd onjuist");
							// dienst weggooien als net nieuw aangemaakt en niet
							// bewerkt
							if (nieuw) {
								controllerGUILink.getKentHetAanbod().verwijderDienst(controllerGUILink.getKentHetAanbod().getKentAlleDiensten().get(positie));
							}
						}
					}
				}
			}
		});
		return dbView;
	}

	public void showFactuur() {
	}

	public void showFactuurMaken() {
		Klant k = null;
		final Factuur factuur = new Factuur();
		ArrayList<Factuur> f = controllerGUILink.getKentAlleFacturen();
		final ArrayList<FactuurRegel> factuurRegels = new ArrayList<FactuurRegel>();
		ArrayList<Klant> klantenLijst = controllerGUILink.getKentAlleKlanten();
		// ArrayList<?> artikelLijst =
		// controllerGUILink.getKentHetAanbod().getKentAlleArtikelen();
		int id = 0;
		if (f.size() != 0) {
			id = f.size();
			id = f.get(id - 1).getFactuurID() + 1;
		}

		// Laat een lijst zien met klanten en valideer de return
		IetsSelecteren kl = showIetsSelecteren("Klant");
		Object o = kl.showDialog(klantenLijst);
		if (o == null) {
			showHoofdMenu();
		} else if (o instanceof Integer) {
			showFactuurMaken();
		} else {
			k = (Klant) o;
			final Klant klantObject = k;
			faView = new FactuurAanmaken(k.getVoornaam(), k.getAchternaam(), k.getAdres(), k.getEmail(), id);
			frame.setContentPane(faView);
			frame.setSize(400, 500);
			frame.pack();
			frame.setVisible(true);

			faView.setListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					if (e.getSource() == faView.getVoegArtikelToe()) {
						// laat een lijst met alle items zijn en voeg er 1 toe
						// aan
						// de lijst;
						IetsSelecteren kl = showIetsSelecteren("Artikel");
						Artikel k = (Artikel) kl.showDialog(controllerGUILink.getKentHetAanbod().getKentAlleArtikelen());
						if (k == null) {

						} else {

							boolean bestaat = false;
							for (int r = 0; r < factuurRegels.size(); r++) {
								if (factuurRegels.get(r).getItem().equals(k)) {
									bestaat = true;
									factuurRegels.get(r).setAantal(factuurRegels.get(r).getAantal() + 1);
									DefaultTableModel f = faView.getModel();
									f.setValueAt(factuurRegels.get(r).getAantal(), r, 2);
									faView.setModel(f);
								}
							}

							if (!bestaat) {
								DefaultTableModel f = faView.getModel();
								f.addRow(new Object[] { k.getID(), k.getBeschrijving(), 1, k.getPrijs() });
								faView.setModel(f);
								factuurRegels.add(new FactuurRegel(1, 19, factuurRegels.size(), k));
							}

							factuur.setKlant(klantObject);
							factuur.setFactuurDatum(new Date());
							for (int r = 0; r < factuurRegels.size(); r++) {
								factuurRegels.get(r).setAantal(Integer.parseInt(faView.getModel().getValueAt(r, 2).toString()));
							}
							factuur.setAlleFactuurRegels(factuurRegels);
							DecimalFormat df = new DecimalFormat("#.##");

							String totaalPrijs = "TotaalPrijs : " + df.format(factuur.berekenTotaalBedrag());
							faView.setTotaalPrijs(totaalPrijs);

							// faView.voegItemToe((Artikel) k);
						}
						System.out.println(factuur);
					}
					if (e.getSource() == faView.getVerstuurFactuur()) {
						Object[] opties = { "Ja", "Nee", "Terug" };
						String titel = "Verzenden facatuur";
						String melding = "Weet u zeker dat u deze factuur wilt verzenden ?";
						int soortOptieDialoog = JOptionPane.YES_NO_CANCEL_OPTION;
						int soortPlaatje = JOptionPane.ERROR_MESSAGE;
						int resultaat = showMelding(opties, titel, melding, soortOptieDialoog, soortPlaatje);
						if (resultaat == JOptionPane.YES_OPTION) {
							controllerGUILink.nieuweFactuur(factuur);
							showHoofdMenu();
							System.out.print("Factuur opgeslagen");
						} else if (resultaat == JOptionPane.NO_OPTION) {
							System.out.print("Factuur niet opgeslagen");
							showHoofdMenu();
						} else if (resultaat == JOptionPane.CANCEL_OPTION) {
							System.out.println("Cansel");

						}
						System.out.print(controllerGUILink.getKentAlleFacturen().size());
					}
					if (e.getSource() == faView.getTerugButton()) {
						showHoofdMenu();
					}
				}
			});
			faView.setTableModelListener(new TableModelListener() {

				@Override
				public void tableChanged(TableModelEvent e) {
					factuur.setKlant(klantObject);
					factuur.setFactuurDatum(new Date());
					for (int r = 0; r < factuurRegels.size(); r++) {
						factuurRegels.get(r).setAantal(Integer.parseInt(faView.getModel().getValueAt(r, 2).toString()));
					}
					factuur.setAlleFactuurRegels(factuurRegels);
					DecimalFormat df = new DecimalFormat("#.##");
					String totaalPrijs = "TotaalPrijs : " + df.format(factuur.berekenTotaalBedrag());
					faView.setTotaalPrijs(totaalPrijs);
				}
			});

		}
	}

	public IetsSelecteren showIetsSelecteren(String naam) {
		ksView = new IetsSelecteren(frame, naam);
		ksView.setListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (e.getSource() == ksView.getTerugButton()) {
					ksView.setCancel();
					ksView.dispose();
				}
				if (e.getSource() == ksView.getSelecteerButton()) {
					ksView.setPressed();
					ksView.dispose();
				}

			}
		});

		ksView.setSize(300, 300);
		return ksView;

	}

	public KlantToevoegen showKlantToevoegen() {
		ktView = new KlantToevoegen();
		frame.setContentPane(ktView);
		frame.pack();
		frame.setVisible(true);

		@SuppressWarnings("serial")
		final ArrayList<JTextField> verplichteVelden = new ArrayList<JTextField>() {
			{
				add(ktView.getVoornaamVak());
				add(ktView.getAchternaamVak());
				add(ktView.getAdresVak());
				add(ktView.getTelnrVak());
				add(ktView.getPlaatsVak());
				add(ktView.getBSNVak());
				add(ktView.getEmailVak());
			}
		};

		ktView.setListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (e.getSource() == ktView.getTerugButton()) {
					showHoofdMenu();
				}
				if (e.getSource() == ktView.getToevoegenButton()) {
					if (verplichtIngevuld(verplichteVelden)) {
						String s = ktView.getBSNVak().getText();
						String s2 = ktView.getTelnrVak().getText();
						if (s.matches("^\\d{9}$") && s2.matches("^\\d{10}$")) {
							int i = controllerGUILink.getKentAlleKlanten().size();
							controllerGUILink.nieuweKlant(ktView.getAdresVak().getText(), ktView.getBSNVak().getText(), ktView.getEmailVak().getText(), ktView.getTelnrVak()
									.getText(), ktView.getTussenvoegselsVak().getText(), ktView.getVoornaamVak().getText(), ktView.getAchternaamVak().getText(), ktView
									.getPlaatsVak().getText());

							if (i < controllerGUILink.getKentAlleKlanten().size()) {
								showOKMelding("Toegevoegd", "Klant \"" + ktView.getVoornaamVak().getText() + " " + ktView.getAchternaamVak().getText() + "\" toegevoegd!");
								showHoofdMenu();
							} else {
								showOKMelding("Klant bestaat al", "Er is al een klant met dit burgerservice nummer");
							}
						} else {

							showOKMelding("Fout in invoer", "Uw telefoonnummer of Bsn nummer is niet correct");
						}
					} else {

						showOKMelding("Fout in invoer", "Niet alle verplichte velden zijn ingevuld!");
					}
				}
			}
		});
		return ktView;
	}

	public void showAanbodWijzigen() {
		awView = new AanbodWijzigen();
		frame.setContentPane(awView);
		frame.pack();
		frame.setVisible(true);

		final Object[] artikelSelected = { null };
		final Object[] dienstSelected = { null };

		awView.setListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (e.getSource() == awView.getArtikelSelecterenButton()) {
					ArrayList<?> artikelenLijst = controllerGUILink.getKentHetAanbod().getKentAlleArtikelen();
					IetsSelecteren artikelenLijstView = showIetsSelecteren("Artikel");
					artikelSelected[0] = artikelenLijstView.showDialog(artikelenLijst);
					if (artikelSelected[0] != null && !(artikelSelected[0] instanceof Integer)) {
						JPanel artikelView = new JPanel();
						Box totaalBox = Box.createVerticalBox();
						ArtikelBijwerken abView = showArtikelBijwerken(artikelSelected[0]);
						totaalBox.add(awView);
						totaalBox.add(abView);
						artikelView.add(totaalBox);
						frame.setContentPane(artikelView);
						frame.pack();

						int positie = matchPlace(artikelenLijst, artikelSelected[0]);
						abView.getNaamVak().setText(controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().get(positie).getNaam());
						abView.getVoorraadVak().setText("" + controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().get(positie).getVoorraad());
						abView.getIDVak().setText("" + controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().get(positie).getID());
						abView.getPrijsVak().setText("" + controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().get(positie).getPrijs());
						abView.getBeschrijvingVak().setText(controllerGUILink.getKentHetAanbod().getKentAlleArtikelen().get(positie).getBeschrijving());
					}
				}
				if (e.getSource() == awView.getDienstSelecterenButton()) {
					ArrayList<?> dienstenLijst = controllerGUILink.getKentHetAanbod().getKentAlleDiensten();
					IetsSelecteren dienstenLijstView = showIetsSelecteren("Dienst");
					dienstSelected[0] = dienstenLijstView.showDialog(dienstenLijst);
					if (dienstSelected[0] != null && !(dienstSelected[0] instanceof Integer)) {
						JPanel dienstView = new JPanel();
						Box totaalBox = Box.createVerticalBox();
						DienstBijwerken dbView = showDienstBijwerken(dienstSelected[0]);
						totaalBox.add(awView);
						totaalBox.add(dbView);
						dienstView.add(totaalBox);
						frame.setContentPane(dienstView);
						frame.pack();

						int positie = matchPlace(dienstenLijst, dienstSelected[0]);
						dbView.getTijdVak().setText("" + controllerGUILink.getKentHetAanbod().getKentAlleDiensten().get(positie).getDienstTijd());
						dbView.getIDVak().setText("" + controllerGUILink.getKentHetAanbod().getKentAlleDiensten().get(positie).getDienstID());
						dbView.getPrijsVak().setText("" + controllerGUILink.getKentHetAanbod().getKentAlleDiensten().get(positie).getDienstPrijs());
						dbView.getBeschrijvingVak().setText(controllerGUILink.getKentHetAanbod().getKentAlleDiensten().get(positie).getDienstOmschrijving());
					}
				}
				if (e.getSource() == awView.getArtikelToevoegenButton()) {
					JPanel artikelView = new JPanel();
					Box totaalBox = Box.createVerticalBox();
					ArtikelBijwerken abView = showArtikelBijwerken(null);
					totaalBox.add(awView);
					totaalBox.add(abView);
					artikelView.add(totaalBox);
					frame.setContentPane(artikelView);
					frame.pack();
				}
				if (e.getSource() == awView.getDienstToevoegenButton()) {
					JPanel dienstView = new JPanel();
					Box totaalBox = Box.createVerticalBox();
					DienstBijwerken abView = showDienstBijwerken(null);
					totaalBox.add(awView);
					totaalBox.add(abView);
					dienstView.add(totaalBox);
					frame.setContentPane(dienstView);
					frame.pack();
				}
			}
		});

	}

	public void showKortingGeven() {
		ArrayList<?> klanten = controllerGUILink.getKentAlleKlanten();
		IetsSelecteren selecteren = showIetsSelecteren("Klant");
		final Object k = selecteren.showDialog(klanten);
		if (k == null) {
			showHoofdMenu();
		} else if ((k instanceof Integer)) {
			showKortingGeven();
		} else {
			Klant kl = (Klant) k;
			kgView = new KortingGeven(kl.getVoornaam(), kl.getAchternaam(), kl.getAdres(), kl.getPlaats(), kl.getEmail(), kl.getTelefoonNummer(), kl.getBsn(),
					"" + kl.getKorting(), "" + kl.getKlantID());

			frame.setContentPane(kgView);
			frame.pack();
			frame.setVisible(true);
			kgView.setListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					boolean once = true;
					if (e.getSource() == kgView.getSlaKortingOpButton()) {
						String korting = kgView.getKlantkortingTextField().getText();
						double kl = 0.0;
						boolean kortingisok = true;
						try {
							kl = Double.parseDouble(korting);
						} catch (NumberFormatException nfe) {
							kortingisok = false;
							// geef aan dat korting niet goed is
						}
						Object[] opties = { "OK", "Cancel" };
						String titel = "Korting wijzigen";
						String melding = "Weet u zeker dat u de korting wilt wijzigen ?";
						int soortOptieDialoog = JOptionPane.YES_NO_OPTION;
						int soortPlaatje = JOptionPane.QUESTION_MESSAGE;

						if (kortingisok && kl < 100 && kl > 0) {
							int resultaat = -1;
							if (once) {
								resultaat = showMelding(opties, titel, melding, soortOptieDialoog, soortPlaatje);
								once = false;
							}
							if (resultaat == JOptionPane.YES_OPTION) {
								Klant klant = (Klant) k;
								klant.setKorting(kl);
								boolean b = controllerGUILink.getKentAlleKlanten().remove((Klant) k);

								if (!b) {
									opties = new Object[] { "OK" };
									melding = "Deze klant bestaat niet";
									soortOptieDialoog = JOptionPane.OK_OPTION;
									soortPlaatje = JOptionPane.ERROR_MESSAGE;
									showMelding(opties, titel, melding, soortOptieDialoog, soortPlaatje);
								} else {
									controllerGUILink.getKentAlleKlanten().add(klant);
									showHoofdMenu();
								}
							}
						} else {
							opties = new Object[] { "OK" };
							soortOptieDialoog = JOptionPane.OK_OPTION;
							soortPlaatje = JOptionPane.ERROR_MESSAGE;
							melding = "Dit is geen geldige korting";
							showMelding(opties, titel, melding, soortOptieDialoog, soortPlaatje);
						}
					}
					if (e.getSource() == kgView.getTerugButton()) {
						showHoofdMenu();
					}
					// TODO Auto-generated method stub

				}
			});
		}
	}

	public void showKortingScherm() {
	}

	public void showNieuwArtikel() {
	}

	public void showParkeerPlaatsReserveren() {

		prView = new ParkeerPlaatsReserveren();
		frame.setContentPane(prView);
		frame.pack();
		frame.setVisible(true);
		prView.setListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				ArrayList<ParkeerReservering> reserveringen = controllerGUILink.getKentParkeerHuis().alleReserveringen();
				ArrayList<ParkeerPlaats> plekken = controllerGUILink.getKentParkeerHuis().alleParkeerPlaatsen();
				ArrayList<ParkeerPlaats> beschikbaar = new ArrayList<ParkeerPlaats>();

				if (e.getSource() == prView.getKiesButton()) {
					String datum = prView.getBeginDatumVak().getText();
					String datum2 = prView.getEindDatumVak().getText();
					SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
					Date beginDatum = null;
					Date eindDatum = null;
					try {
						beginDatum = dateformat.parse(datum);
						eindDatum = dateformat.parse(datum2);
					} catch (ParseException e1) {
					}
					if (beginDatum == null || eindDatum == null) {
						Object[] opties = { "OK", };
						String titel = "Datum invoeren";
						String melding = "Dit is geen geldige datum";
						int soortOptieDialoog = JOptionPane.OK_OPTION;
						int soortPlaatje = JOptionPane.QUESTION_MESSAGE;
						showMelding(opties, titel, melding, soortOptieDialoog, soortPlaatje);
					} else {
						System.out.println("Reserveringen: " + reserveringen.size());

						for (ParkeerPlaats p : plekken) {
							if (reserveringen.size() != 0) {
								boolean b = true;
								for (ParkeerReservering r : reserveringen) {
									if (p.getPlaatsID() == r.getReserveringVoor().getPlaatsID()) {
										if (((r.getBeginDatum().before(beginDatum)) && r.getEindDatum().before(beginDatum)) || r.getBeginDatum().after(eindDatum)) {

										} else {
											b = false;
										}
									}
								}
								if (b) {
									beschikbaar.add(p);
								}
							} else {
								beschikbaar.add(p);
							}
						}
						IetsSelecteren kl = showIetsSelecteren("Parkeerplek");
						Object o = kl.showDialog(beschikbaar);
						ParkeerPlaats park = null;
						if (o == null) {
							showParkeerPlaatsReserveren();
						} else if (o instanceof Integer) {
							showHoofdMenu();
						} else {
							park = (ParkeerPlaats) o;

							Klant k = null;
							ArrayList<Klant> klantenLijst = controllerGUILink.getKentAlleKlanten();
							kl = showIetsSelecteren("Klant");
							Object p = kl.showDialog(klantenLijst);
							if (p == null) {
								showParkeerPlaatsReserveren();
							} else if (p instanceof Integer) {
								showHoofdMenu();
							} else {
								k = (Klant) p;
								controllerGUILink.getKentParkeerHuis().nieuweReservering(k, beginDatum, eindDatum, park);
								showHoofdMenu();
								System.out.println("Reservering toegevoegd: " + k + "  " + park);
							}
						}

					}
					System.out.println("Beschikbaar: " + beschikbaar.size());

				}
				if (e.getSource() == prView.getTerugButton()) {
					showHoofdMenu();
				}

			}
		});
	}

	public void showRapport() {
	}

	public void showRapportOpties() {
	}

	public void showTotaalPrijs() {
	}

	public void showVoerBeginEindDatumIn() {
	}

	public void showOKMelding(String titel, String melding) {
		JOptionPane.showMessageDialog(frame, melding, titel, JOptionPane.WARNING_MESSAGE);
	}

	public int showMelding(Object[] opties, String titel, String melding, int soortOptieDialoog, int soortPlaatje) {
		int n = 0;
		if (soortOptieDialoog == JOptionPane.YES_NO_CANCEL_OPTION) {
			n = JOptionPane.showOptionDialog(frame, melding, titel, soortOptieDialoog, soortPlaatje, null, opties, opties[opties.length - 1]);
		} else if (soortOptieDialoog == JOptionPane.YES_NO_OPTION) {
			n = JOptionPane.showOptionDialog(frame, melding, titel, soortOptieDialoog, soortPlaatje, null, opties, opties[opties.length - 1]);
		} else if (soortOptieDialoog == JOptionPane.YES_OPTION) {
			n = JOptionPane.showOptionDialog(frame, melding, titel, soortOptieDialoog, soortPlaatje, null, opties, opties[opties.length - 1]);
		} else if (soortOptieDialoog == JOptionPane.OK_OPTION) {
			n = JOptionPane.showOptionDialog(frame, melding, titel, soortOptieDialoog, soortPlaatje, null, opties, opties[opties.length - 1]);
		}

		return n;
	}

	public boolean verplichtIngevuld(ArrayList<JTextField> verplichteVelden) {
		for (JTextField verplichtVeld : verplichteVelden) {
			if (verplichtVeld.getText().trim().isEmpty()) {
				return false;
			}
		}
		return true;
	}

	public int matchPlace(ArrayList<?> lijst, Object object) {
		int i = 0;
		for (Object o : lijst) {
			if (o == object) {
				break;
			}
			i++;
		}
		return i;
	}
}
